#include <stdio.h>
#include <stdint.h>

typedef union {
    uint16_t v;
    uint8_t bytes[2]; // bytes[0] 是小地址,bytes[1]是大地址:w
}u16;

/* 方法1: 利用联合体进行取不同地址对应数
 * 利用联合体, 对2byte 联合体赋值后, 分别检查高低地址字节数据是否为大端特征
 * */
void isBigEnding() {
    u16 a;
    a.v = 0x1234;

    if (a.bytes[0] == 0x12 && a.bytes[1] == 0x34) {
        printf("big ending\n");
    }
    else if (a.bytes[0] == 0x34 && a.bytes[1] == 0x12) {
        printf("little ending\n");
    }
    else {
        printf("error value");
    }
    
    return;
}

#include <arpa/inet.h>
/* 方法2: 利用已知端序的API, 进行比较
 * 利用已知的网络序为大端, 而htons是将2byte主机序数据转换成网络序, 判断转换前后是否有变化
 * 如果没变化, 则说明为大端; 如果有, 则说明为小端
 * */
void isBigEnding2() {
    uint16_t hport = 0x8000;
    uint16_t nport = htons(hport); // 网络字节序是大端
    
    printf("number in net byte order is 0x%x\n", nport );
    if (hport == nport) {
        printf("big ending\n");
    }
    else {
        printf("little ending\n");
    }
}

/*
 * 方法3:取地址直接转换
*/
void isBigEnding3() {
    uint16_t n = 0x1234;
    if ( *(uint8_t *)&n == 0x12) {
        printf("big ending\n");
    }
    else if (*(uint8_t *)&n == 0x34) {
        printf("little ending\n");
    }
    else {
        printf("error value");
    }
}

/* 写一个程序判断所使用系统的字节序 */
int main() {
    isBigEnding();
    isBigEnding2();
    isBigEnding3();
    return 0;
}

